package javase.ch05.homeWork.Demo1;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 模拟B/S服务器
 * 浏览器访问格式：http://服务器IP:8888
 */
public class BSServer {
    public static void main(String[] args) {
        System.out.println("B/S服务器启动中...");
        ServerSocket serverSocket = null;
        try {
            // 创建服务器Socket，监听8888端口
            serverSocket = new ServerSocket(8888);
            System.out.println("服务器启动成功，监听端口：8888");

            while (true) { // 循环接收客户端请求
                // 等待浏览器连接（阻塞方法）
                Socket socket = serverSocket.accept();
                System.out.println("收到新连接：" + socket.getInetAddress());

                // 启动线程处理请求（支持并发访问）
                new Thread(() -> handleClient(socket)).start();
            }
        } catch (IOException e) {
            System.err.println("服务器异常：" + e.getMessage());
        } finally {
            if (serverSocket != null) {
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 处理客户端（浏览器）请求
     */
    private static void handleClient(Socket socket) {
        BufferedReader in = null;
        PrintStream out = null;
        try {
            // 获取输入流（读取浏览器请求）
            in = new BufferedReader(
                new InputStreamReader(socket.getInputStream())
            );

            // 获取输出流（向浏览器响应数据）
            out = new PrintStream(
                socket.getOutputStream(), 
                true, // 自动刷新
                "UTF-8" // 字符编码
            );

            // 读取HTTP请求的第一行（仅做日志打印，实际处理可忽略）
            String requestLine = in.readLine();
            System.out.println("请求信息：" + requestLine);

            // 获取客户端IP地址
            String clientIp = socket.getInetAddress().getHostAddress();
            
            // 获取当前时间
            String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
                .format(new Date());

            // 构建HTTP响应头（必须符合HTTP协议规范）
            out.println("HTTP/1.1 200 OK"); // 响应状态行
            out.println("Content-Type: text/html; charset=utf-8"); // 内容类型
            out.println("Server: MyBSServer/1.0"); // 服务器标识
            out.println(); // 空行（响应头结束标志）

            // 构建HTML响应体
            StringBuilder html = new StringBuilder();
            html.append("<html>")
                .append("<head>")
                .append("<meta charset='UTF-8'>")
                .append("<title>模拟B/S服务器</title>")
                .append("</head>")
                .append("<body>")
                .append("<h1 style='color:blue'>欢迎访问我的服务器！</h1>")
                .append("<p>您的IP地址：").append(clientIp).append("</p>")
                .append("<p>访问时间：").append(time).append("</p>")
                .append("<hr>")
                .append("</body>")
                .append("</html>");

            // 发送HTML内容
            out.println(html.toString());

        } catch (IOException e) {
            System.err.println("处理请求异常：" + e.getMessage());
        } finally {
            // 关闭资源
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (out != null) {
                out.close();
            }
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}